package org.paybiz.util;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.paybiz.model.PayModel;
import org.paybiz.model.PayReqResultDO;
import org.paybiz.model.PayResultDO;

/**
 * Description:签名的工具类
 * 
 * @author LiChunming
 * @version V1.0
 * @createDateTime：2010-10-18 下午03:33:59
 * @Company: MSD.
 * @Copyright: Copyright (c) 2010
 */
public class PaySignUtil {

    /**
     * 获取对象属性值,用于签名
     * @param obj
     * @return
     */
    public static String getObjPropVal(Object obj) {
        StringBuilder sValue = new StringBuilder();
        Field fieldlist[] = Fields.getInstance(obj).getFieldsArray();
        try {
            for (int i = 0; i < fieldlist.length; i++) {
                Field fld = fieldlist[i];
                fld.setAccessible(true);
                Object value = fld.get(obj);
                    /*String fieldName = fld.getName();
                    System.out.println(fieldName + " = " + value);*/
                //空、集合、数组不参与签名
                if (value == null || "".equals(value)) {
                    continue;
                } else if (value instanceof Collection) {
                    continue;
                } else if (value instanceof List) {
                    continue;
                } else if (value instanceof String[]) {
                    continue;
                } else {
                    String fieldName = fld.getName();
                    if(!"hmac".equals(fieldName) && !"sign".equals(fieldName)) {
                        sValue.append(value);
                    }
                }
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return sValue.toString();
    }

    /**
     * 通用方法,获取对象的签名
     * @param obj
     * @param key 密钥
     * @return
     */
    public static String getComObjSign(Object obj,String key){
        if (obj == null || "".equals(obj)) {
            return "";
        }
        return getComStrSign(getObjPropVal(obj).toString(), key);
    }
    
    /**
     * 通用方法,获取字符串签名
     * @param str
     * @param key 密钥
     * @return
     */
    public static String getComStrSign(String str,String key){
        if (StringUtils.isEmpty(str)) {
            return "";
        }
        return PayCenterSignature.hmacSign(str, key);
    }
    
    /**
     * 确定支付时获取签名
     * 
     * @param payDO
     *            支付实体
     * @param msdValue
     *            签名KEY
     * @return
     */
    public static String getPayDOHmac(PayModel payDO, String msdValue) {
        return getComObjSign(payDO,msdValue);
    }

    /**
     * 支付回调时返回
     * 
     * @param payResultDO
     * @param msdValue
     * @return
     */
    public static String getPayResultDOHmac(PayResultDO payResultDO,
            String msdValue) {
        return getComObjSign(payResultDO,msdValue);
    }

    /**
     * 获取内部结果签名
     * 
     * @param payResultDO
     *            内部支付结果对象
     * @param msdValue
     *            内部密钥
     * @return
     */
    public static String getPayReqResultDOHmac(PayReqResultDO payReqResultDO,
            String msdValue) {
        return getComObjSign(payReqResultDO,msdValue);
    }
}
